/** Keriosity, ESIR 2
 * 	Map (Modele): classe permettant de gerer les calques et listener de la carte
 *	@author: GOUYET Brett
 *	@date: 14/05/2012
 */

package keriosity.map;

import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import android.graphics.drawable.Drawable;
import android.util.Log;


/** Cette classe va reunir le calque de la carte, ainsi que le listener **/
public class Map implements IMap{
	
	protected MapView _mapView = null;
	protected MapTracer _mapTracer = null; //calque sur lequel on positionne les points
	protected MapRoute _mapRoute = null; //calque sur lequel on trace le chemin
	protected MapListener _mapListener = null; //ecouteur de carte pour poser les points
	protected GeoPoint _destination = null; //destination du robot	
	protected GeoPoint _kerPosition = null; //position de keriosity
	
	
	/** CONSTRUCTEUR **/
	public Map(MapView mapView){
		
		_mapView = mapView;
		_mapView.setBuiltInZoomControls(true);
        _mapView.setMultiTouchControls(true);
        _mapView.setClickable(true); 
        _mapView.getController().setZoom(1); //on a une vue generale en attendant d'avoir la position de Keriosity
        
        //on ajoute le listener
        _mapListener = new MapListener(_mapView.getContext(), this);
        _mapView.getOverlays().add(_mapListener);
		
		//on creer le calque, on peut choisir le marker: http://www.darshancomputing.com/android/1.5-drawables.html
        Drawable keriosityMarker = _mapView.getResources().getDrawable(android.R.drawable.star_on);
        keriosityMarker.setBounds(0, keriosityMarker.getIntrinsicHeight(), keriosityMarker.getIntrinsicWidth(), 0);
        _mapTracer = new MapTracer(keriosityMarker, _mapView.getContext(), this);
        _mapView.getOverlays().add(_mapTracer); //on ajoute le calque a la map
               
        //on cree le calque qui comportera l'itineraire
        _mapRoute = new MapRoute(_mapView.getContext());
        _mapView.getOverlays().add(_mapRoute);
       
        //on ne connait pas encore la position du robot
        _kerPosition = null; 
        
        _mapView.invalidate(); //on rafraichit la carte
   }
	
	
	/** Methode creant un point sur le calque de la carte **/
	public void createPointDestination(){
	    
		if(_destination != null){ //si on a une destination valide
			_mapTracer.addDestination(_destination, "Destination", "Destination"); //on ajoute le point au calque			
			_mapView.invalidate(); //on rafraichit la carte
		}
	}
	
	
	/** On modifie la destination en fonction du touche de l'utilisateur **/
	public void setDestination(GeoPoint destination){
		_destination = destination;		
	}
	
	
	/** On renvoi la destination actuelle**/
	public GeoPoint getDestination(){
		return _destination;
	}

	
	/** Methode annulant la selection de la derniere destination **/
	public void undo(){
		_mapTracer.undo();		
		_mapView.invalidate();
	}
	
	
	/** Methode netoyant la carte en ne concervant que la destination actuelle **/	
	public void clean(){
		_mapTracer.clean(); //on enleve toutes les destinations sauf la derniere
		_mapRoute.clean(); //on enleve tout les traits traces		
		_mapView.invalidate(); //on rafraichit la carte
	}

	
	/** Methode permettant de se relocaliser sur Keriosity **/
	public void find(){
		
		if(_kerPosition != null){
			_mapView.getController().setZoom(16); //on zoom a 16, pour voir les batiments
			_mapView.getController().setCenter(_kerPosition); //on centre sur keriosity		
			_mapView.invalidate(); //on rafraichit			
		}
	}
		
	
	/** On modifie la position de Keriosity sur la carte **/
	public void moveKeriosity(GeoPoint newPlacement){
		
		
		Log.i("map", "move Ker" + newPlacement.getLatitudeE6()+ "," + newPlacement.getLongitudeE6() );
		
		if(newPlacement != null){ //si le nouvel emplacement est valide
			
			if(_kerPosition == null){ //si keriosity n'est pas encore dans la liste, on le cree
				_kerPosition = new GeoPoint(newPlacement);
				_mapTracer.addItem(newPlacement, "Keriosity", "Keriosity"); //on ajoute le point au calque
				_mapTracer.setMarker(0, _mapView.getResources().getDrawable(android.R.drawable.ic_menu_myplaces)); //on modofie le marker du robot
				_mapView.getController().setZoom(16); //on zoom a 16, pour voir les batiments
			}
			else{ 
				if(_kerPosition.distanceTo(newPlacement) > 1 ){//si le robot s'est deplace de plus de 1 metre
					
					_kerPosition.setCoordsE6(newPlacement.getLatitudeE6(), newPlacement.getLongitudeE6()); //on change les coordonees de Keriosity
					_mapTracer.setGeoPoint(0, newPlacement.getLatitudeE6(), newPlacement.getLongitudeE6()); //on modifie la position du robot sur la carte
				}
			}	
			_mapRoute.addPoint(new GeoPoint(newPlacement.getLatitudeE6(), newPlacement.getLongitudeE6()));//on ajoute la nouvelle position a l'itineraire
			_mapView.getController().setCenter(_kerPosition); //on centre sur le robot	
			_mapView.invalidate(); //on rafraichit la carte
		}
	}
}